//package com.gosling.gosling;
//
//import java.math.BigDecimal;
//
///**
// * @Software: IntelliJ IDEA
// * @Addresses: www.gosling.com
// * @Email 1793327033@qq.com
// * @Classname lhltest
// * @Author: lihonglin
// * @Date: 2021/8/8 17:36
// */
//public class Test20240103 {
//
//    private BorrProductDomain previewRetPlan(FBorrProduct borrProduct, FBorrProdParams borrParam, Date startDate, BigDecimal amount) {
//
//        List<FRetMonPlan> retMonPlanList = new ArrayList<FRetMonPlan>();
//        int sysDeductPer = borrParam.getSysDeductPer();// 系统划扣期
//        int orgRepayPer = borrParam.getOrgRepayPer();// 机构还款期
//        int stuLowPer = borrParam.getStuLowPer();// 学生低额期
//        int stuHighPer = borrParam.getStuHighPer();// 学生高额期
//        int totalPer = borrParam.getNper(); // 总期数
//        int nperTemp = 1;
//        // 如果是放款时扣除方式，需要增加第0期
//        if (sysDeductPer == 1) {
//            totalPer += 1;
//            nperTemp = 0;
//        }
//        BigDecimal cotAmt = new BigDecimal(0);// 合同金额
//        BigDecimal riskBakAmt = new BigDecimal(0);// 风险备用金
//        BigDecimal consAmt = new BigDecimal(0);// 咨询服务费
//        BigDecimal retAmt = new BigDecimal(0);// 当期还款金额
//        BigDecimal monDiscount = new BigDecimal(0);// 每月贴现
//        BigDecimal remPrinAmt = new BigDecimal(0);// 对应还款日前剩余本金
//        BigDecimal fPrintAmt = new BigDecimal(0);// 当期本金F
//        BigDecimal printAmt = new BigDecimal(0);// 当期本金---废弃
//        BigDecimal fInter = new BigDecimal(0);// 当期利息F
//        BigDecimal inter = new BigDecimal(0);// 当期利息---废弃
//        BigDecimal repaymentAmt = new BigDecimal(0);// 已还款金额
//        BigDecimal retAmtSum = new BigDecimal(0);// retAmt之和
//        BigDecimal printAmtSum = new BigDecimal(0);// printAmt之和
//        BigDecimal printAmtTemp = new BigDecimal(0);// printAmt之和
//        BigDecimal retAmtTemp = new BigDecimal(0);// retAmt之和
//        BigDecimal interSum = new BigDecimal(0);// 当期利息之和
//        BigDecimal interTemp = new BigDecimal(0);// 当期利息之和
//        boolean isNegative = false;
//        List<Date> repayDateList = getRepayDate(startDate, totalPer, borrProduct.getRepayMode());
//        for (int i = 0; i < totalPer; i++) {
//            FRetMonPlan plan = new FRetMonPlan();
//            plan.setRetStatus((short) RetplanStatusEnum.PROCESSING.getId());
//            plan.setCreateTime(new Date());
//
//            plan.setNper(i + nperTemp);
//            /* 还款日 */
//            plan.setRetAmtDate(repayDateList.get(i));
//
//            /* 当期还款金额 */
//            if (0 <= i && i < sysDeductPer) {
//                retAmt = amount.multiply(borrParam.getSysDeductRate()).setScale(2, BigDecimal.ROUND_HALF_UP);
//            } else if (sysDeductPer <= i && i < sysDeductPer + orgRepayPer) {
//                retAmt = amount.multiply(borrParam.getOrgRepayRate()).setScale(2, BigDecimal.ROUND_HALF_UP);
//            } else if (sysDeductPer + orgRepayPer <= i && i < sysDeductPer + orgRepayPer + stuLowPer) {
//                retAmt = amount.multiply(borrParam.getStuLowRate()).setScale(2, BigDecimal.ROUND_HALF_UP);
//            } else if (sysDeductPer + orgRepayPer + stuLowPer <= i && i < sysDeductPer + orgRepayPer + stuLowPer + stuHighPer) {
//                retAmt = amount.multiply(borrParam.getStuHighRate()).setScale(2, BigDecimal.ROUND_HALF_UP);
//            }
//            retAmtSum = retAmtSum.add(retAmt);
//            plan.setRetAmt(retAmt);
//
//            /* 每月贴现 */
//            BigDecimal t1 = borrProduct.getMonthRate().add(new BigDecimal(1));
//            BigDecimal t2 = t1.pow(plan.getNper()).setScale(10, BigDecimal.ROUND_HALF_UP);
//            monDiscount = retAmt.divide(t2, 2, BigDecimal.ROUND_HALF_UP);
//            plan.setMonDiscount(monDiscount);
//
//            /* 合同金额 */
//            cotAmt = cotAmt.add(monDiscount);
//            plan.setCotAmt(cotAmt);
//
//            retMonPlanList.add(plan);
//        }
//
//        if (borrProduct.getProdType().equals(ProductTypeEnum.EDU_LOAN.getId())) {
//            // 众信要求必须是100的整数倍，此处直接舍弃小于100的部分
//            cotAmt = cotAmt.divide(new BigDecimal("100"), 0, BigDecimal.ROUND_DOWN).multiply(new BigDecimal("100"));
//        }
//
//        for (int i = 0; i < retMonPlanList.size(); i++) {
//            FRetMonPlan plan = retMonPlanList.get(i);
//            retAmtTemp = retAmtTemp.add(plan.getRetAmt());
//            /* 对应还款日前剩余本金 */
//            if (i == 0) {
//                remPrinAmt = cotAmt;
//            } else {
//                remPrinAmt = retMonPlanList.get(i - 1).getRemPrinAmt().subtract(retMonPlanList.get(i - 1).getCurrPrintAmt());
//            }
//            plan.setRemPrinAmt(remPrinAmt.setScale(2, BigDecimal.ROUND_HALF_UP));
//
//            /* 当期利息-F */
//            if (plan.getRetAmt().compareTo(new BigDecimal(0)) == 0) {
//                fInter = new BigDecimal(0);
//            } else {
//                if (i == 0) {
//                    if (sysDeductPer == 1) {
//                        fInter = new BigDecimal(0);
//                    } else {
//                        fInter = cotAmt.multiply(borrProduct.getMonthRate()).setScale(2, BigDecimal.ROUND_HALF_UP);
//                    }
//                } else {
//                    if (retMonPlanList.get(i - 1).getRetAmt().compareTo(new BigDecimal(0)) > 0) {
//                        fInter = plan.getRemPrinAmt().multiply(borrProduct.getMonthRate()).setScale(2, BigDecimal.ROUND_HALF_UP);
//                    } else {
//                        BigDecimal t1 = null;
//                        BigDecimal t4 = borrProduct.getMonthRate().add(new BigDecimal(1));// 合同月利率+1
//                        BigDecimal t5 = t4.pow(i);// (合同月利率+1)^i
//                        if (sysDeductPer == 1) {
//                            t1 = cotAmt.subtract(retMonPlanList.get(0).getRetAmt());
//                        } else {
//                            t1 = cotAmt;
//                        }
//                        BigDecimal t2 = t1.multiply(t5).subtract(new BigDecimal(1));
//                        BigDecimal t6 = amount.multiply(borrParam.getOrgRepayRate());
//                        BigDecimal t7 = t4.pow(1 + orgRepayPer).subtract(new BigDecimal(1));
//                        BigDecimal t8 = t7.divide(borrProduct.getMonthRate(), 10, BigDecimal.ROUND_HALF_UP);
//                        BigDecimal t9 = t8.subtract(new BigDecimal(borrParam.getOrgRepayPer())).subtract(new BigDecimal(1));
//                        BigDecimal t10 = t6.multiply(t9);
//                        fInter = t2.subtract(t10);
//                    }
//                }
//            }
//            plan.setCurrInterest(fInter);
//
//            /* 当期本金-F */
//            fPrintAmt = plan.getRetAmt().subtract(plan.getCurrInterest());
//            plan.setCurrPrintAmt(fPrintAmt);
//
//            /* 当期违约金 */
////            BigDecimal t11 = plan.getRetAmt().multiply(new BigDecimal(0.05f)).setScale(2, BigDecimal.ROUND_HALF_UP);
////            if (t11.compareTo(new BigDecimal(50)) > 0) {
////                plan.setDefAmt(t11);
////            } else {
////                plan.setDefAmt(new BigDecimal(50));
////            }
//            plan.setDefAmt(amount.multiply(new BigDecimal(0.001f)).setScale(2, BigDecimal.ROUND_HALF_UP));
//
//            /* 已还款金额 */
//            repaymentAmt = repaymentAmt.add(plan.getRetAmt());
//            plan.setRepayAmt(repaymentAmt);
//
//            /* 未还款金额 */
//            plan.setNoRepayAmt(retAmtSum.subtract(plan.getRepayAmt()).add(plan.getRetAmt()));
//
//            /* 当期1天的罚息 */
////            plan.setDayRetAmt(plan.getNoRepayAmt().multiply(new BigDecimal(0.001f)).setScale(2, BigDecimal.ROUND_HALF_UP));
//            plan.setDayRetAmt(plan.getNoRepayAmt().multiply(new BigDecimal(0.0006f)).setScale(2, BigDecimal.ROUND_HALF_UP));
//            if (plan.getCurrPrintAmt().compareTo(new BigDecimal(0)) < 0 || plan.getCurrInterest().compareTo(new BigDecimal(0)) < 0) {
//                isNegative = true;
//            }
//        }
//
//        // 如果当期利息或者当期本金小于0，按照新算法计算
//        BigDecimal resPrinBeginZhh = null;// 期初剩余本金
//        BigDecimal curInterestZhh = null;// 当期利息
//        BigDecimal curPrinZhh = null;// 当期本金
//        if (isNegative) {
//            for (int i = 0; i < retMonPlanList.size(); i++) {
//                if (i == 0) {
//                    resPrinBeginZhh = cotAmt;
//                    if (retMonPlanList.get(0).getRetAmt().compareTo(new BigDecimal(0)) == 0) {
//                        curInterestZhh = new BigDecimal(0);
//                    } else {
//                        curInterestZhh = retMonPlanList.get(0).getRetAmt();
//                    }
//                } else {
//                    resPrinBeginZhh = retMonPlanList.get(i - 1).getRemPrinAmt().subtract(retMonPlanList.get(i - 1).getCurrPrintAmt());
//                    if (retMonPlanList.get(i).getRetAmt().compareTo(new BigDecimal(0)) == 0) {
//                        curInterestZhh = new BigDecimal(0);
//                    } else {
//                        if (i < orgRepayPer + stuLowPer) {
//                            curInterestZhh = retMonPlanList.get(i).getRetAmt();
//                        } else if (i == orgRepayPer + stuLowPer) {
//                            BigDecimal t1 = new BigDecimal(0);
//                            BigDecimal t2 = new BigDecimal(0);
//                            BigDecimal t3 = new BigDecimal(0);
//                            BigDecimal t4 = new BigDecimal(0);
//                            BigDecimal t5 = new BigDecimal(0);
//                            BigDecimal t6 = new BigDecimal(0);
//                            BigDecimal t7 = new BigDecimal(0);
//                            BigDecimal t8 = new BigDecimal(0);
//                            BigDecimal t9 = new BigDecimal(0);
//                            BigDecimal t10 = new BigDecimal(0);
//                            BigDecimal t11 = new BigDecimal(0);
//                            t1 = borrProduct.getMonthRate().add(new BigDecimal(1));// 1+合同月利率
//                            t2 = t1.pow(i + 1).subtract(new BigDecimal(1));
//                            t3 = t2.multiply(cotAmt);
//                            t4 = t1.pow(stuLowPer + 1);
//                            t5 = t1.pow(orgRepayPer).subtract(new BigDecimal(1));
//                            t6 = amount.multiply(borrParam.getOrgRepayRate()).multiply(t4).multiply(t5);
//                            t7 = t6.divide(borrProduct.getMonthRate(), 10, BigDecimal.ROUND_HALF_UP);
//                            t8 = t3.subtract(t7);
//                            t9 = t1.pow(stuLowPer).subtract(new BigDecimal(1));
//                            t10 = amount.multiply(borrParam.getStuLowRate()).multiply(t1).multiply(t9);
//                            t11 = t10.divide(borrProduct.getMonthRate(), 10, BigDecimal.ROUND_HALF_UP);
//                            curInterestZhh = t8.subtract(t11);
//                        } else {
//                            curInterestZhh = resPrinBeginZhh.multiply(borrProduct.getMonthRate());
//                        }
//                    }
//                }
//                curInterestZhh = curInterestZhh.setScale(2, BigDecimal.ROUND_HALF_UP);
//                curPrinZhh = retMonPlanList.get(i).getRetAmt().subtract(curInterestZhh);
//
//                retMonPlanList.get(i).setRemPrinAmt(resPrinBeginZhh);
//                retMonPlanList.get(i).setCurrPrintAmt(curPrinZhh);
//                retMonPlanList.get(i).setCurrInterest(curInterestZhh);
//            }
//        }
//
//        /* 处理最后一期本金和利息 */
//        FRetMonPlan plan = retMonPlanList.get(retMonPlanList.size() - 1);
//        plan.setCurrPrintAmt(plan.getRemPrinAmt());
//        plan.setCurrInterest(plan.getRetAmt().subtract(plan.getCurrPrintAmt()));
//
//        /* 一次性提前还款 */
//        BigDecimal earlyAmountZhh = new BigDecimal(0);// 提前还款金额
//        for (int i = 0; i < retMonPlanList.size(); i++) {
//            BigDecimal sum = new BigDecimal(0);// 总的当期还款
//            BigDecimal t1 = new BigDecimal(0);
//            BigDecimal t2 = new BigDecimal(0);
//            BigDecimal t3 = new BigDecimal(0);
//            BigDecimal t4 = new BigDecimal(0);
//            BigDecimal t5 = new BigDecimal(0);
//            if (i > 0) {
//                sum = sum.add(retMonPlanList.get(i - 1).getRetAmt());
//            }
//            if (sysDeductPer == 1) {
//                // 如果是提前收取
//                if (i == 0 || i == 1) {
//                    t1 = borrParam.getAverageRate().multiply(cotAmt);
//                    t2 = cotAmt.multiply(new BigDecimal(0.01));
//                    t3 = t2.add(amount);
//                    earlyAmountZhh = t3.add(t1);
//                } else if (i > 1 && i < 7) {
//                    t1 = borrParam.getAverageRate().multiply(cotAmt);
//                    t2 = t1.multiply(new BigDecimal(i));
//                    t3 = cotAmt.multiply(new BigDecimal(0.03));
//                    t4 = t2.add(t3);
//                    t5 = t4.subtract(sum);
//                    earlyAmountZhh = t5.add(amount);
//                } else {
//                    continue;
//                }
//            } else {
//                if (i == 0) {
//                    t1 = borrParam.getAverageRate().multiply(cotAmt);
//                    t2 = cotAmt.multiply(new BigDecimal(0.01));
//                    t3 = t2.add(amount);
//                    earlyAmountZhh = t3.add(t1);
//                } else if (i > 0 && i < 6) {
//                    t1 = borrParam.getAverageRate().multiply(cotAmt);
//                    t2 = t1.multiply(new BigDecimal(i + 1));
//                    t3 = cotAmt.multiply(new BigDecimal(0.03));
//                    t4 = t2.add(t3);
//                    t5 = t4.subtract(new BigDecimal(0));
//                    earlyAmountZhh = t5.add(amount);
//                } else {
//                    continue;
//                }
//            }
//            retMonPlanList.get(i).setOnceAmt(earlyAmountZhh.setScale(2, BigDecimal.ROUND_HALF_UP));
//        }
//
//        // 2017-7-6修改，一次性还款金额算法
//        BigDecimal sumCurInterestZhh = new BigDecimal(0);// 总的当期利息
//        BigDecimal lastCurInterestZhh = new BigDecimal(0);// 上一次的当期利息
//        BigDecimal thisCurInterestZhh = new BigDecimal(0);// 本次的当期利息
//        int nper1 = 6;
//        int nper2 = orgRepayPer + stuLowPer;
//        if (nper2 < nper1) {
//            nper1 = orgRepayPer + stuLowPer;
//            nper2 = 6;
//        }
//        for (int i = retMonPlanList.size() - 1; i >= 0; i--) {
//            if (i == retMonPlanList.size() - 1) {
//                earlyAmountZhh = retMonPlanList.get(i).getRemPrinAmt().add(retMonPlanList.get(i).getCurrInterest());
//                retMonPlanList.get(i).setOnceAmt(earlyAmountZhh.setScale(2, BigDecimal.ROUND_HALF_UP));
//            } else if (i >= nper2) {
//                if (retMonPlanList.get(i).getCurrInterest().compareTo(new BigDecimal(0)) > 0) {
//                    lastCurInterestZhh = retMonPlanList.get(i + 1).getCurrInterest();
//                    thisCurInterestZhh = retMonPlanList.get(i).getCurrInterest();
//                } else {
//                    lastCurInterestZhh = new BigDecimal(0);
//                }
//                sumCurInterestZhh = sumCurInterestZhh.add(lastCurInterestZhh);
//                BigDecimal t1 = sumCurInterestZhh.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP);
//                earlyAmountZhh = retMonPlanList.get(i).getRemPrinAmt().add(t1).add(thisCurInterestZhh);
//                retMonPlanList.get(i).setOnceAmt(earlyAmountZhh.setScale(2, BigDecimal.ROUND_HALF_UP));
//            } else if (i >= nper1 && i < nper2 && orgRepayPer + stuLowPer > 6) {
//                retMonPlanList.get(i).setOnceAmt(retMonPlanList.get(nper2).getOnceAmt().setScale(2, BigDecimal.ROUND_HALF_UP));
//            }
//        }
//
//        cotAmt = cotAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
//        riskBakAmt = cotAmt.multiply(borrProduct.getRiskBakRate()).setScale(2, BigDecimal.ROUND_HALF_UP);
//        consAmt = cotAmt.subtract(riskBakAmt).subtract(amount);
//
//        BorrProductDomain result = new BorrProductDomain();
//        result.setRetPlanList(retMonPlanList);
//        result.setCalcId(borrProduct.getCalcId());
//        result.setCotAmt(cotAmt);
//        result.setRiskBakAmt(riskBakAmt);
//        result.setConsAmt(consAmt);
//        result.setDeductAmt(amount.multiply(borrParam.getSysDeductRate()).setScale(2, BigDecimal.ROUND_HALF_UP));
//        result.setOrgRepay("否");
//        result.setOrgRetAmt(amount.multiply(borrParam.getOrgRepayRate()).setScale(2, BigDecimal.ROUND_HALF_UP));
//        result.setOrgTotalRetAmt(result.getOrgRetAmt().multiply(new BigDecimal(orgRepayPer)).setScale(2, BigDecimal.ROUND_HALF_UP));
//        result.setStuLowRetAmt(amount.multiply(borrParam.getStuLowRate()).setScale(2, BigDecimal.ROUND_HALF_UP));
//        result.setStuTotalInter(result.getStuLowRetAmt().multiply(new BigDecimal(stuLowPer)).setScale(2, BigDecimal.ROUND_HALF_UP));
//        result.setStuHighRetAmt(amount.multiply(borrParam.getStuHighRate()).setScale(2, BigDecimal.ROUND_HALF_UP));
//        result.setStuTotalRetAmt(result.getStuHighRetAmt().multiply(new BigDecimal(stuHighPer)).setScale(2, BigDecimal.ROUND_HALF_UP));
//
//        return result;
//    }
//
//
//    private List<Date> getRepayDate(Date startDate, int nper, String repayMode, String repayDate) {
//        Calendar cal = Calendar.getInstance();
//        cal.setTime(startDate);
//        Date currDate = cal.getTime();
//        Date payDate = null;
//        Date tempDate = null;
//        int currDay = DateUtil.getDay(currDate);
//        /* 还款日 */
//        int mon = 0;
//        int day = 0;
//        List<Date> result = new ArrayList<>();
//        boolean nextMon = currDay > 15;
//        for (int i = 0; i < nper; i++) {
//            if (nper == 0) {
//                payDate = startDate;
//            } else {
//                if (CommonConstants.BORR_PRODUCT_REPAY_MODE_FIXED_DAY.equals(repayMode)) {
//                    // 每月固定日15/30还款
//                    if (i == 0 && !nextMon) {
//                        tempDate = currDate;
//                    } else {
//                        tempDate = DateUtil.addMonth(currDate, 1);
//                    }
//                    cal.setTime(tempDate);
//                    mon = DateUtil.getMonth(tempDate);
//                    if (nextMon) {
//                        cal.set(Calendar.DATE, 15);
//                    } else {
//                        if (mon == 2) {
//                            cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
//                        } else {
//                            cal.set(Calendar.DATE, 30);
//                        }
//                    }
//                    payDate = cal.getTime();
//                    currDate = payDate;
//                } else if (CommonConstants.BORR_PRODUCT_REPAY_MODE_T_PLUS_30.equals(repayMode)) {
//                    day += 30;
//                    payDate = DateUtil.addDay(currDate, day);
//                } else if (CommonConstants.BORR_PRODUCT_REPAY_MODE_FIXED_DATE.equals(repayMode)) {
//                    tempDate = DateUtil.addMonth(currDate, 1);
//                    cal.setTime(tempDate);
//                    if (StringUtils.isNotBlank(repayDate)) {
//                        cal.set(Calendar.DATE, Integer.parseInt(repayDate));
//                    }
//                    payDate = cal.getTime();
//                    currDate = payDate;
//                } else if (CommonConstants.BORR_PRODUCT_REPAY_MODE_DAY_TO_DAY.equals(repayMode)) {
//                    //日对日还款
//                    payDate = DateUtils.addMonths(startDate, i + 1);
//                }
//            }
//            result.add(payDate);
//        }
//
//        return result;
//    }
//
//}
